import * as shop from '@/api/shop'

const state = {
  // {id:商品 id ， quantity：购物车商品数量}
  items: [],
  // success | faild
  checkoutStatus: null
}

const mutations = {
  // 购物车中存在
  incrementItemQuantity (state, payload) {
    const item = state.items.find(({ id }) => id === payload.cartItem.id)
    item.quantity++
  },
  // 购物车中不存在
  pushProductToCart (state, payload) {
    state.items.push({
      id: payload.id,
      quantity: 1
    })
  },
  setCheckoutStatus (state, payload) {
    state.checkoutStatus = payload
  },
  setItems (state, payload) {
    state.items = payload
  }
}

const actions = {
  addProductToCart ({ state, commit }, product) {
    // 是否还有添加次数
    if (product.inventory) {
      const cartItem = state.items.find(({ id }) => id === product.id)
      if (cartItem) { // 如果购物车已存在该商品
        commit({
          type: 'incrementItemQuantity',
          cartItem
        })
      } else { // 购物车不存在该商品
        commit({
          type: 'pushProductToCart',
          id: product.id
        })
      }
      // 修改原始剩余值
      // 如果 调用其他模块 mutations ，需要添加 {root：true} ，不加 即便写了 products 也只会调当前模块的
      commit('products/decrementProductInventoty', { id: product.id }, { root: true })
    } else {
      console.log('商品库存为空')
    }
  },
  checkout ({ state, commit }, product) {
    // 备份购物车数据
    const saveCartProducts = [...product]
    // 清除支付状态
    commit('setCheckoutStatus', null)
    // 清空购物车
    commit('setItems', [])
    // 发起结账请求
    //      成功，设置成功状态
    //      失败，设置失败状态，回滚购物车数据
    shop.buyProducts(product, () => {
      commit('setCheckoutStatus', 'successful')
    }, () => {
      commit('setCheckoutStatus', 'failed')
      commit('setItems', saveCartProducts)
    })
  }
}

const getters = {
  // 购物车中数据，由于 items 只传了两个参数，不够，所以用 getters处理下
  // rootState 根模块，用于访问其他模块数据
  cartProducts (state, getters, rootState) {
    return state.items.map(product => {
      const prod = rootState.products.all.find(({ id }) => id === product.id)
      return {
        id: prod.id,
        title: prod.title,
        price: prod.price,
        quantity: product.quantity
      }
    })
  },
  // getters 当前模块的getters
  totalPrice (state, getters) {
    return getters.cartProducts.reduce((total, current) => {
      return total + current.price * current.quantity
    }, 0)
  }
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}
